package com.foo.designpattern.flyweight.SimplexFlyweight;

import java.util.HashMap;
import java.util.Map;

/**
 * com.foo.designpattern.flyweight.SimplexFlyweight
 * Created with IntelliJ IDEA.
 * Created by jiang on 2016-05-23 16:17.
 *
 * @Description 享元工厂(FlyWeightFactory)角色
 * 享元工厂角色类：
 * 本角色负责创建和管理享元角色。本角色必须保证享元对象可以被系统适当地共享。
 * 当一个客户端调用一个享元对象的时候，享元工厂角色会检查系统中是否已经有一个符合要求的享元对象。
 * 如果已经有了，享元工厂角色就应当提供这个已有的享元对象；
 * 如果系统中没有一个适当的享元对象的话，享元工厂角色就应当创建一个合适的享元对象。
 * 客户端不可以直接将具体享元类实例化，而必须通过一个工厂对象，利用一个factory()方法得到享元对象。
 * 一般而言，享元工厂对象在整个系统中只有一个，因此也可以使用单例模式。
 * <p/>
 * 享元模式的优点：
 * 享元模式的优点在于它大幅度地降低内存中对象的数量。
 * 享元模式的缺点：
 * 1、享元模式使得系统更加复杂。为了使对象可以共享，需要将一些状态外部化，这使得程序的逻辑复杂化。
 * 2、享元模式将享元对象的状态外部化，而读取外部状态使得运行时间稍微变长。
 */

public class FlyWeightFactory {
    private Map<Character, Flyweight> files = new HashMap<Character, Flyweight>();

    public Flyweight factory(Character state) {
        // 先从缓存中查找对象
        Flyweight flyweight = files.get(state);
        if (null == flyweight) {
            // 如果不存在则创建一个新的Flyweight对象
            flyweight = new ConcreteFlyweight(state);
            // 把这个新的Flyweight对象添加到缓存中
            files.put(state, flyweight);
        }
        return flyweight;
    }
}
